package van.planifolia.service.impl;

import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import van.planifolia.dao.DeptDao;
import van.planifolia.pojo.Dept;
import van.planifolia.service.DeptService;

import javax.annotation.Resource;
import java.util.concurrent.TimeUnit;

/**
 * @Description: TODO
 * @Author: Van.Planifolia
 * @CreateTime: 2022-12-07  16:31
 * @Version: 1.0
 */
@Service("deptService")
public class DeptServiceImpl implements DeptService {
    @Resource(name = "deptDao")
    private DeptDao deptDao;
    @Resource
    private RedisTemplate<String, Object> redisTemplate;

    /**
     * 根据主键id查询部门信息
     *
     * @param id 部门的主键id
     * @return 查到的部门信息
     */
    @Override
    public Dept getDeptById(Integer id) {
        // 查询之前先检索Redis缓存
        Object o = redisTemplate.opsForValue().get("dept::" + id);
        // 若检索到缓存就直接返回缓存信息
        if (o instanceof Dept) {
            return (Dept) o;
        }
        // 若没检索到就存入缓存并且返回检索到的信息
        Dept dept = deptDao.selectById(id);
        if (dept != null){
            redisTemplate.opsForValue().set("dept::" + id, dept, 15, TimeUnit.MINUTES);
        }
        return dept;
    }

    @Override
    public int removeById(Integer id) {
        // 在删除之前先删除缓存
        redisTemplate.delete("dept::" + id);
        // 然后执行数据库删除
        return deptDao.deleteById(id);
    }

    /**
     * 根据传递过来的内容更新部门信息
     *
     * @param dept 传递过来的新部门信息
     * @return 更新的信息
     */
    @Override
    public Dept modifyDept(Dept dept) {
        // 更新需要在Mysql更新后再去更新缓存
        int i = deptDao.updateById(dept);
        if (i > 0) {
            redisTemplate.opsForValue().set("dept::" + dept.getDeptno(), dept);
        }
        return dept;
    }

    /**
     * 添加一个部门信息
     *
     * @param dept 被添加的信息
     * @return 被添加的信息
     */
    @Override
    public Dept addDept(Dept dept) {
        deptDao.insert(dept);
        return dept;
    }
}
